home *** CD-ROM | disk | FTP | other *** search
- ;unsigned short word_count(strg);
- ; char *strg;
-
- EXTRN _memory_model:byte
-
- _TEXT SEGMENT BYTE PUBLIC 'CODE'
- ASSUME CS:_TEXT
- PUBLIC _word_count
- _word_count proc near
- push ds ;
- push si ;
- mov bx,sp ;BX points to stack
- cmp _memory_model,0 ;near or far?
- jle begin ;jump if near
- inc bx ;else add 2 to BX
- inc bx ;
- begin: cmp _memory_model,2 ;data near or far?
- jb L0 ;jump if near
- les si,ss:dword ptr[bx+6] ;point ES:SI to string
- jmp short L00 ;
- L0: mov si,[bx+6] ;near case
- L00: sub dx,dx ;clear DX as counter
- cmp byte ptr[si],0 ;test for null string?
- je L3 ;quit if null
- mov al,32 ;AL holds space char
- L1: mov ah,[si] ;get a char
- inc si ;forward pointer for next time
- cmp ah,0 ;end of string?
- je L3 ;
- cmp ah,al ;char a space?
- je L1 ;loop if so
- inc dx ;word starts -- inc word counter
- L2: mov ah,[si] ;get a char
- inc si ;forward pointer for next time
- cmp ah,0 ;end of string?
- je L3 ;
- cmp ah,al ;char a space?
- je L1 ;back to spc loop if so
- jmp short L2 ;else next word char
- L3: mov ax,dx ;set return value
- pop si ;
- pop ds ;
- cmp _memory_model,0 ;quit
- jle quit ;
- db 0CBh ;RET far
- quit: ret ;RET near
- _word_count ENDP
- _TEXT ENDS
- END